#include "druk.h"

char* czytajPlik(char *nazwaPliku) {
  char *s;
  int ile = 0;
  int i = 0;
  char z;
  FILE *f = fopen(nazwaPliku, "r");
  
  if (f != NULL) {
    while ( (z=getc(f)) != EOF ) {
      ile++;
    }
    // dlugosc lancucha = ile znakow jest w pliku i znak konczacy
    s = malloc(sizeof(char) * (ile+1));    
    fseek(f, 0, SEEK_SET);
    while ( (z=getc(f)) != EOF ) {
      s[i] = z;
      i++;
    }
    s[i] = '\0';
  } else {
    return NULL;
  }
  fclose(f);
  //printf("&s=%x s=%x s=\"%s\"\n", (unsigned int)&s, (unsigned int)s, s);
  return s;
}

void zamknij(char* s) {
  //printf("&s=%x s=%x s=\"%s\"\n", (unsigned int)&s, (unsigned int)s, s);
  free(s);
  //printf("&s=%x s=%x s=\"%s\"\n", (unsigned int)&s, (unsigned int)s, s);
}

int druk(char *s, char *pattern) {
  regex_t p;
  regmatch_t pm[2];
  regoff_t last_match = 0;         // indeks, od ktorego szukamy w lancuchu
  char *buf;                    // pomocniczy lancuch - tylko do wydruku
  
  buf = malloc(sizeof(char) * strlen(s));
  
  // Kompilacja wyrazenia regularnego
  regcomp(&p, pattern, 0);

  puts("-----------------------------------------------------");
  printf("Lancuch: %s\n", s);
  printf("Wzorzec: %s\n", pattern);
  puts("- - - - - - - - - - - - - - - - - - - - - - - - - - -");
  
  // Wyszukiwanie wszystkich podlancuchow pasujacych do wzorca  
  while (regexec(&p, s+last_match, 2, pm, 0) == 0) {
    // pm[0].rm_so - offset poczatku dopasowania
    // pm[0].rm_eo - offset nastepnego znaku po dopasowaniu

    printf("znaki <%d", pm[0].rm_so + last_match);
    printf(", %d) ", pm[0].rm_eo + last_match);
    memcpy(buf, &s[pm[0].rm_so + last_match], pm[0].rm_eo - pm[0].rm_so);
    buf[ pm[0].rm_eo - pm[0].rm_so ] = '\0';
    printf("z dopasowaniem \"%s\"\n", buf);
    
    // ustawienie, od ktorego indeksu szukamy
    last_match += pm[0].rm_so + 1; 
  }
  
  puts("-----------------------------------------------------");
  
  free(buf);
  regfree(&p);
  return 0;
}